//
// Created by PengYH on 2024/7/18.
//

#ifndef CMAKE_SAMPLE_SRC_TEST_TEST_JSON2STRUCT_AI_STRUCT_DEFINE_H_
#define CMAKE_SAMPLE_SRC_TEST_TEST_JSON2STRUCT_AI_STRUCT_DEFINE_H_

#include <string>
#include <vector>
#include "AIGCJson.hpp"

namespace ai {

/// 抓拍|实时结果
class CMD_Result {
 public:
  std::string type;     // 固定值；road_trigger_result
  int32_t chnlid = -1;  // 算法通道
  class Body {
   public:
    class RoadTriggerResult {
     public:
      class Result {
       public:
        class Locate {
         public:
          int32_t bottom;
          int32_t left;
          int32_t right;
          int32_t top;
          AIGC_JSON_HELPER(bottom, left, right, top)
        };
        class Plate {
         public:
          Locate loc;
          int32_t plate_color;
          int32_t plate_conf;
          std::string plate_str;
          int32_t plate_type;
          AIGC_JSON_HELPER(loc, plate_color, plate_conf,
                           plate_str, plate_type)
        };
        class AlarmInfo {
         public:
          int32_t alarm_error_type;    // 报警类型
          int32_t alarm_status;        // 报警状态
          AIGC_JSON_HELPER(alarm_error_type, alarm_status)
        };
        class CarExtInfo {
         public:
          int32_t car_color_id;         // -1,
          int32_t car_color_score;// 0,
          std::string car_color_str; // "无",
          int32_t car_type_id; // -1,
          int32_t car_type_id_source; // -1,
          int32_t car_type_score; // 0,
          std::string car_type_str; // "无",
          std::string car_type_str_source; // "无"
          AIGC_JSON_HELPER(car_color_id, car_color_score, car_color_str,
                           car_type_id, car_type_id_source, car_type_score,
                           car_type_str, car_type_str_source)
        };
        class TriggerExtend {
         public:
          int32_t zone_id; // 0,
          int32_t zone_type; // 0,
          std::string user_data; // "some data",
          int32_t snap_mode; // 0
          AIGC_JSON_HELPER(zone_id, zone_type, user_data, snap_mode)
        };
        int32_t order_score;        // 订单得分

        int32_t can_drop;           // 是否可丢弃
        int32_t group_id;           // 组ID

        int32_t alg_report_mode;    // 上报模式；0=证据链上报；1=事件上报

        // 车位
        int32_t zone_id;            // 区域id
        std::string zone_name;      // 区域名称
        int32_t zone_type;          // 区域类型
        int32_t parking_state;      // 停车状态

        int32_t confidence;         // 车牌置信度
        int32_t covered_event;      // 是否被遮挡

        // 国标车牌
        std::string plate_str;      // 车牌号
        int32_t plate_type;         // 车牌类型
        int32_t plate_color;        // 车牌颜色
        Locate plate_loc;           // 车牌坐标
        double plate_mean;          // 车牌图像像素的均值，辅助ISP调试图像
        int32_t plate_sharpness;    // 清晰度
        bool recent_plate;          // 是否是最近的车牌
        int32_t plate_covered;      // 车牌是否被遮挡
        bool plate_isocc;           // 是否被遮挡；模型输出

        Plate hk_plate;             // 香港车牌信息
        Plate mc_plate;             // 澳门车牌信息

        // 车身
        bool had_car_body;          // 是否有车身坐标
        int32_t alg_car_id;         // 车辆ID
        Locate car_loc;             // 车身坐标
        int32_t car_pos;            // 车辆部位；0=无效，1=车头，2=车尾
        CarExtInfo car_ext_info;    // 车辆拓展信息
        std::string car_series;     // 车型车标信息
        int32_t car_stable_count;   // 车辆跟踪状态，稳定次数

        int32_t nonmotor_id;            // 非机动车ID
        int32_t nonMotor_car_type;      // 非机动车类型

        int32_t out_video_start;        // 开始录制视频的标志
        int64_t enter_start_timestamp;  // 进场时间戳
        int32_t force_leave_flag;       // 是否强制离场

        int32_t reco_flag;              // 每次都返回1
        int64_t time_pts;               // 绝对时间，不受修改系统时间影响的时间戳
        int64_t time_s;                 // 本地时间

        Locate roof_loc;                // 车顶坐标
        Locate head_loc;                // 车头坐标
        Locate window_loc;              // 车窗坐标
        Locate sideWindow_loc;          // 侧窗坐标

        TriggerExtend trigger_extend;   // 拓展信息

        AlarmInfo alarm_info;           // 报警信息

        AIGC_JSON_HELPER(alarm_info, alg_car_id, alg_report_mode,
                         can_drop, car_series, car_stable_count,
                         covered_event, enter_start_timestamp,
                         force_leave_flag, group_id, hk_plate, mc_plate,
                         nonMotor_car_type, nonmotor_id, out_video_start,
                         parking_state, plate_color, plate_loc, plate_mean,
                         plate_sharpness, plate_str, plate_type, reco_flag,
                         time_pts, time_s, zone_id, zone_name, zone_type,
                         plate_covered, plate_isocc, recent_plate,
                         roof_loc, head_loc, window_loc, sideWindow_loc,
                         trigger_extend, confidence, had_car_body,
                         car_loc, car_pos, car_ext_info, order_score)
      };

      std::vector<Result> result;
      int32_t result_num;     // result个数
      int32_t trigger_type;   // trigger类型；Vz_AlgGrab_EventType

      AIGC_JSON_HELPER(result, result_num, trigger_type)
    } road_trigger_result;

    AIGC_JSON_HELPER(road_trigger_result)
  } body;

  AIGC_JSON_HELPER(type, chnlid, body)
};

}

#endif //CMAKE_SAMPLE_SRC_TEST_TEST_JSON2STRUCT_AI_STRUCT_DEFINE_H_
